package com.ict.controller;

import com.ict.api.dto.IctProductDTO;
import com.ict.api.result.ApiResponse;
import com.ict.api.vo.IctProductVO;
import com.ict.api.vo.PageResult;
import com.ict.service.IctProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 *
 * @author wjp
 * @since 2025-03-23
 */
@RestController
@RequestMapping("/ict-product")
public class IctProductController {

    @Autowired
    private IctProductService productService;


    @Value("${img_file-path:/img/}")
    private String imgFilepath;

    /**
     * 获取商品列表（支持分页、条件查询）
     * @param productDTO 商品查询参数
     * @return
     */
    @GetMapping("/products")
    public ApiResponse<PageResult<IctProductVO>> getProductList(IctProductDTO productDTO) {
        PageResult<IctProductVO> map = productService.getProductList(productDTO);
        return ApiResponse.success(map);
    }

    /**
     * 添加商品
     * @param productDTO 商品查询参数
     * @return
     */
    @PostMapping("/product")
    public ApiResponse addProduct(@RequestBody IctProductDTO productDTO) {
        productService.addProduct(productDTO);
        return ApiResponse.success();
    }

    /**
     * 修改商品信息
     * @param id 商品Id
     * @param productDTO 商品修改参数
     * @return
     */
    @PutMapping("/product/{id}")
    public ApiResponse updateProductInfo(@PathVariable Long id, @RequestBody IctProductDTO productDTO) {
        productService.updateProductInfo(id, productDTO);
        return ApiResponse.success();
    }

    /**
     * 删除商品信息
     * @param id 商品Id
     * @return
     */
    @DeleteMapping("/product/{id}")
    public ApiResponse deleteProduct(@PathVariable Long id) {
        productService.deleteProduct(id);
        return ApiResponse.success();
    }

    /**
     * 获取商品详情
     * @param id 商品Id
     * @return
     */
    @GetMapping("/product/{id}")
    public ApiResponse<IctProductVO> findProduct(@PathVariable Long id) {
        IctProductVO ictProductVO = productService.findProduct(id);
        return ApiResponse.success(ictProductVO);
    }


    /**
     * 文件上传
     *      1. 接收页面传递上来的文件
     *      2. 保存到硬盘上
     *      3. 处理细节：
     *          3.1 保存文件的时候，目录不会自动创建，所以要确保这个目录必须存在，可以使用代码来创建目录
     *          3.2 必须确保文件的名称唯一 , 可以使用UUID... 生成一串随机字符串
     *          3.3 文件的后缀名必须是动态变化，不能固定是 jpg | png ... 可以获取原始文件名，然后切割出来后缀名
     *          3.4 上传成功之后，要给页面返回文件的名字，以便后续的下载操作，可以下载这张图片。
     * @param file
     * @return
     */
    @PostMapping("/product/upload")
    public ApiResponse<Map<String, String>> upload(MultipartFile file){
        Map<String, String> map = productService.uploadProductImg(file, imgFilepath);
        return ApiResponse.success(map);
    }


    /**
     * 文件下载
     *      1. 获取要下载的文件
     *      2. 到以前保存文件的目录里面去找出来这个文件
     *      3. 然后使用IO对接，把文件写到页面上
     *      4. 最后可以给一个结果 ： 成功，失败！
     * @param name
     * @return
     */
    @GetMapping("/product/download")
    public ApiResponse download(String name){ // aa.jpg
        productService.download(name, imgFilepath);
        return ApiResponse.success();
    }
}

